package com.xj.algorithm.leetcode;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * Fizz Buzz
 */
public class L412_指定倍数打印映射结果 {

    /**
     * 写一个程序，输出从 1 到 n 数字的字符串表示。
     * <p>
     * 1. 如果 n 是3的倍数，输出“Fizz”；
     * <p>
     * 2. 如果 n 是5的倍数，输出“Buzz”；
     * <p>
     * 3.如果 n 同时是3和5的倍数，输出 “FizzBuzz”。
     * <p>
     * 示例：
     * <p>
     * n = 15,
     * <p>
     * 返回:
     * [
     * "1",
     * "2",
     * "Fizz",
     * "4",
     * "Buzz",
     * "Fizz",
     * "7",
     * "8",
     * "Fizz",
     * "Buzz",
     * "11",
     * "Fizz",
     * "13",
     * "14",
     * "FizzBuzz"
     * ]
     */
    public static void main(String[] args) {
        System.out.println(fizzBuzzGood(15));
    }

    //自己的解法：转化
    public static List<String> fizzBuzz(int n) {
        List<String> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            String value = "";
            if (i % 3 == 0) {
                value = value + "Fizz";
            }
            if (i % 5 == 0) {
                value = value + "Buzz";
            }
            if (value.length() == 0) {
                value = value + i;
            }
            list.add(value);
        }
        return list;
    }

    //精彩解法：lambda解法
    public static List<String> fizzBuzzGood(int n) {
        return IntStream.range(1, n + 1)
                .mapToObj(i -> {
                    if (i % 3 == 0 && i % 5 == 0) return "FizzBuzz";
                    if (i % 3 == 0) return "Fizz";
                    if (i % 5 == 0) return "Buzz";
                    return String.valueOf(i);
                })
                .collect(Collectors.toList());
    }
}
